perm filename TRAJ.SAI[SYS,HE]14 blob
sn#108131 filedate 1974-06-26 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00027 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00004 00002 DEFINE WRITE="DEB_HAND"
C00008 00003 EXTERNAL INTEGER SIMPLE PROCEDURE PSTRING(REFERENCE INTEGER ISTRING S)
C00010 00004 SIMPLE PROCEDURE INCREMENT(SAFE REAL ARRAY DTH,DX_DY_DZBOOLEAN COMP)
C00014 00005 SIMPLE PROCEDURE FORCE(SAFE REAL ARRAY TQ,FV)
C00017 00006 PROCEDURE FREE_JOINT(REFERENCE INTEGER DATWD)
C00019 00007 SIMPLE PROCEDURE SCHEINMAN (SAFE REAL ARRAY RES,TH)
C00023 00008 SIMPLE PROCEDURE FLUSH(BOOLEAN FINISHSAFE REAL ARRAY TS)
C00027 00009 SIMPLE PROCEDURE REVOLVE(SAFE REAL ARRAY P,O REAL TH)
C00028 00010 EXTERNAL SIMPLE PROCEDURE PACK(REFERENCE INTEGER PTRINTEGER PERIODREFERENCE REAL BUF)
C00032 00011 IFC WAVE THENC
C00034 00012 SIMPLE MESSAGE PROCEDURE SET_TRANS(STRING SREAL ARRAY T)
C00037 00013 PROCEDURE POLY (REAL ARRAY COEFFS INTEGER #SEGS
C00042 00014 PRELOAD_WITH 0.5, 0.5, 0.25, 1.0, 1.0, 2.5
C00043 00015 INTEGER SIMPLE PROCEDURE KISEKIBEGIN
C00047 00016 PROCEDURE TRAJECTORY(REAL ARRAY T0,TF,TRANS)
C00051 00017 SIMPLE MESSAGE PROCEDURE TO_ARM(REAL ARRAY TREFERENCE INTEGER FLAG)
C00054 00018 SIMPLE MESSAGE PROCEDURE GO_ARM(REAL ARRAY TREFERENCE INTEGER FLAG)
C00058 00019 SIMPLE MESSAGE PROCEDURE DRAW_ARM(REAL ARRAY PROFILEINTEGER STAT)
C00063 00020 SIMPLE MESSAGE PROCEDURE START_TRAJECTORY(STRING FILEINTEGER START)
C00065 00021 SIMPLE MESSAGE PROCEDURE OPEN_HAND(REAL OPENING)
C00069 00022 SIMPLE MESSAGE PROCEDURE CHANGE_ARM(REAL ARRAY DIRREAL DIST
C00072 00023 SIMPLE MESSAGE PROCEDURE SET_ARM(STRING STREAL ARRAY V,WRT)
C00074 00024 SIMPLE MESSAGE PROCEDURE DRIVE_ARM(INTEGER JOINTREAL DEGINTEGER TIMEREFERENCE INTEGER FLAG)
C00078 00025 SIMPLE MESSAGE PROCEDURE TALK_ARMINTERP←TRUE
C00079 00026 SIMPLE MESSAGE PROCEDURE OTHER_GO
C00083 00027 SIMPLE MESSAGE PROCEDURE ARM_ASSIGN(STRING SINTEGER VAL)
C00086 ENDMK
C⊗;
DEFINE WRITE="DEB_HAND";
EXTERNAL INTEGER _SKIP_;
DEFINE AVT (A, S, CA, SA)="1.0, -CA, SA, A, 1.0, CA, -SA, A, 0.0, SA, CA, S, [3] 0.0, 1.0, 0.0 ";
DEFINE AVP (A, S, CA, SA)="-CA, SA, A, CA, -SA, A";
DEFINE AVS (A, CA, SA, CT, ST)="CT, -CA*ST, SA*ST, A*CT, ST, CA*CT, -SA*CT, A*ST,
0.0, SA, CA, 1.0, [3] 0.0, 1.0, 0.0 ";
DEFINE QT = "0.0, -1.0, 0.0, 0.0, 1.0, [12] 0.0 ";
DEFINE QS = "[11] 0.0, 1.0, [5] 0.0 ";
DEFINE JDEF (M, X, Y, Z, IXX, IYY, IZZ) =".5*(-IXX+IYY+IZZ), 0.0, 0.0, M*X, 0.0,
.5*(IXX-IYY+IZZ), 0.0, M*Y, 0.0, 0.0, .5*(IXX+IYY-IZZ), M*Z, M*X, M*Y, M*Z, M, 0.0 ";
IFC BLUE THENC
REQUIRE "BLUE.DAT" SOURCE_FILE;
ELSEC
REQUIRE "YELLOW.DAT[SYS,HE]" SOURCE_FILE;
ENDC
SAFE REAL ARRAY U1,T[0:101];
SAFE REAL ARRAY DIAG[1:7];
SAFE REAL ARRAY LAST_PLANNED_TRANS,PARK_TRANS[1:4,1:4];
SAFE REAL ARRAY LAST_PLANNED_ARM[1:6];
SAFE REAL ARRAY ARRIVE_ARM,DEPART_ARM[1:4];
REAL F1_ARM,F2_ARM,OBJECT_MASS,OBJECT_KXX,OBJECT_KYY,OBJECT_KZZ;
INTEGER T1_ARM,T2_ARM,MERGE;
INTEGER BFJ;
DEFINE MAX_SEG="8";
SAFE REAL ARRAY POSITION[1:6,0:MAX_SEG];
SAFE REAL ARRAY KOE[1:6,1:(MAX_SEG*4)+6];
SAFE INTEGER ARRAY PERIOD[1:6,1:MAX_SEG];
SAFE INTEGER ARRAY NS[1:6];
SAFE REAL ARRAY POS[0:MAX_SEG];
SAFE REAL ARRAY SOLN[1:(MAX_SEG*3)+6];
SAFE INTEGER ARRAY TIM[1:MAX_SEG];
SAFE STRING ARRAY BANDS[0:'37];
SAFE INTEGER ARRAY TRACK[0:'40];
INTEGER NEXT_BAND,BAND,BAND_NUMBER;
PRELOAD_WITH 0,'1040,0;
SAFE INTEGER ARRAY GOODIE[1:3];
DEFINE UFBWRT="'707000000000";
BOOLEAN FORCED,WAS_FORCED,FAST;
SAFE REAL ARRAY LAST_ARM[1:6];
SAFE REAL ARRAY LAST_TRANS[1:4,1:4];
SAFE REAL ARRAY QA,D[0:16];
SAFE REAL ARRAY TF[1:6];
SAFE REAL ARRAY LU,NR[1:6,1:6];
REAL DIGITS;
INTEGER LOOP,JOINT,DURATION;
SAFE REAL ARRAY REAL_DATA[1:18];
REQUIRE "MATRIX.REL[SYS,HE]" LOAD_MODULE;
REQUIRE "SAILIB.REL[SYS,HE]" LOAD_MODULE;
EXTERNAL SIMPLE PROCEDURE MMOVE(REFERENCE REAL R,A);
EXTERNAL SIMPLE PROCEDURE MTIMES(REFERENCE REAL R,A,B);
EXTERNAL REAL SIMPLE PROCEDURE TRACET(REFERENCE REAL X,Y);
EXTERNAL SIMPLE PROCEDURE DECOMPOSE(INTEGER I; REAL ARRAY NR,LU);
EXTERNAL SIMPLE PROCEDURE SOLVE(INTEGER I;REAL ARRAY NR,LU,DTH);
EXTERNAL SIMPLE PROCEDURE IMPROVE(INTEGER I; REAL ARRAY NR,LU,DA,DTH;REFERENCE REAL DIGITS);
INTEGER SIMPLE PROCEDURE SQAR (INTEGER I);
RETURN ((I-1)*17);
EXTERNAL INTEGER SIMPLE PROCEDURE PSTRING(REFERENCE INTEGER I;STRING S);
SIMPLE PROCEDURE COMPLETA (INTEGER I;SAFE REAL ARRAY TH);
BEGIN REAL S,C;
INTEGER J,K;
J←SQAR(I);
K←6*(I-1);
S←SIND(TH[I]);
C←COSD(TH[I]);
A[J]←C;
A[J+1]←APAR[K]*S;
A[J+2]←APAR[K+1]*S;
A[J+3]←APAR[K+2]*C;
A[J+4]←S;
A[J+5]←APAR[K+3]*C;
A[J+6]←APAR[K+4]*C;
A[J+7]←APAR[K+5]*S;
END;
SIMPLE PROCEDURE HANDPOS(SAFE REAL ARRAY TH);
BEGIN INTEGER I;
FOR I←1,2,4,5,6 DO COMPLETA(I,TH);
A[SQAR(3)+11]←TH[3];
A[3]←A[3]+SHOLDER[1];
A[7]←A[7]+SHOLDER[2];
MMOVE(A[0],A[0]);
MMOVE(T[0],A[0]);
UNDERFLOW(14);
FOR I←2 STEP 1 UNTIL 6 DO MTIMES(T[SQAR(I)],T[SQAR(I-1)],A[SQAR(I)]);
UNDERFLOW(0);
END;
SIMPLE PROCEDURE UPDATE_SEG;
BEGIN INTEGER I;
HANDPOS(ARM_VECTOR);
FOR I←3 STEP 1 UNTIL 6 DO
BEGIN
ARRBLT(ARM_LINK[I,1,1],T[SQAR(I)],16);
END;
GRASP←ARM_VECTOR[7];
END;
SIMPLE PROCEDURE NOT_LESS(REFERENCE REAL V;REAL L);
BEGIN
IF V<0.0 ∧ V>-L THEN BEGIN V←0; RETURN END;
IF V≥0.0 ∧ V< L THEN V←0;
END;
SIMPLE PROCEDURE INCREMENT(SAFE REAL ARRAY DTH,DX_DY_DZ;BOOLEAN COMP);
BEGIN PRELOAD_WITH 3,7,11;
SAFE OWN INTEGER ARRAY KEY[1:6];
PRELOAD_WITH [6] 0.0; SAFE OWN REAL ARRAY DIR[1:6];
INTEGER I,J;
REAL MAX,R;
LABEL OUT;
REDUCE(DX_DY_DZ);
IF DX_DY_DZ[1]=0.0 ∧
DX_DY_DZ[2]=0.0 ∧
DX_DY_DZ[3]=0.0 THEN BEGIN FOR I←1 STEP 1 UNTIL 6 DO DTH[I]←0.0;
RETURN;
END;
UNDERFLOW(14);
ARRBLT(DIR[1],DX_DY_DZ[1],3);
IF ¬COMP THEN BEGIN
IF ABS(T[85+2])<ABS(T[85+6])
THEN BEGIN KEY[4]←2;
KEY[5]←IF ABS(T[85+6])<ABS(T[85+10]) THEN 6 ELSE 10
END
ELSE BEGIN KEY[4]←6;
KEY[5]←IF ABS(T[85+2])<ABS(T[85+10]) THEN 2 ELSE 10
END;
KEY[6]←IF ABS(T[85+4])>ABS(T[85+0])
THEN IF ABS(T[85+8])>ABS(T[85+4]) THEN 9 ELSE 5
ELSE IF ABS(T[85+8])>ABS(T[85+0]) THEN 9 ELSE 1;
MMOVE(U1[SQAR(6)],A[SQAR(6)]);
FOR I←5 STEP -1 UNTIL 2 DO
BEGIN MTIMES(U1[SQAR(I)],A[SQAR(I)],U1[SQAR(I+1)]);
MTIMES(U1[SQAR(I+1)],Q[(IF I=2 THEN 17 ELSE 0)],U1[SQAR(I+1)])
END;
A[3]←A[7]←0.0;
MMOVE(A[0],A[0]);
MTIMES(U1[0],A[0],U1[SQAR(2)]);
MTIMES(U1[SQAR(2)],Q[0],U1[SQAR(2)]);
FOR I←2 STEP 1 UNTIL 6 DO MTIMES(U1[SQAR(I)],T[SQAR(I-1)],U1[SQAR(I)]);
MTIMES(U1[0],Q[0],U1[0]);
FOR I←1 STEP 1 UNTIL 6 DO
FOR J←1 STEP 1 UNTIL 6 DO
NR[J,I]←U1[SQAR(I)+KEY[J]];
DECOMPOSE(6,NR,LU);
END;
SOLVE(6,LU,DIR,DTH);
IMPROVE(6,NR,LU,DIR,DTH,DIGITS);
MAX←0;
FOR I←1 STEP 1 UNTIL 6 DO IF (R←ABS(DIR[I]))>MAX THEN MAX←R;
FOR I←1 STEP 1 UNTIL 6 DO IF (R←ABS(DTH[I]))>MAX THEN
BEGIN FOR J←I+1 STEP 1 UNTIL 6 DO IF ABS(DTH[I]+DTH[J])/R<0.5 THEN
BEGIN DTH[I]←0;
DTH[J]←0;
GO TO OUT;
END;
END;
OUT: FOR I←1 STEP 1 UNTIL 6 DO BEGIN
DTH[I]←IF I=3 THEN DTH[I] ELSE RAD*DTH[I];
NOT_LESS(DTH[I],@-5);
END;
UNDERFLOW(0);
END;
INTEGER SIMPLE PROCEDURE LIMITS(SAFE REAL ARRAY JOINT);
BEGIN INTEGER I;
FOR I←1 STEP 1 UNTIL 6 DO
IF (STOP[I,1]-JOINT[I])*(JOINT[I]-STOP[I,2])<0.0 THEN RETURN(I);
RETURN (0);
END;
SIMPLE PROCEDURE FAST_WRITE;
IF FAST
THEN BEGIN LABEL OK;
START_CODE LABEL WRT;
HRRZ 1,GOODIE;
HRRZ 2,COEFF;
MOVEM 2,(1);
MOVE 3,BAND_NUMBER;
MOVEI 4,10;
WRT: UFBWRT 3,(1);
SOJGE 4,WRT;
MOVEI 2,'20;
ADDM 2,2(1);
JUMPGE 4,OK;
END;
USERERR(0,1,"TRAJECTORY WRITE ERROR");
OK: END
ELSE ARRYOUT('16,COEFF[0],'1000);
SIMPLE PROCEDURE FORCE(SAFE REAL ARRAY TQ,FV);
BEGIN
STRING S;
INTEGER I,L;
REAL XS,YS;
SAFE OWN REAL ARRAY F,M,P[1:4];
SAFE OWN REAL ARRAY INV[1:4,1:4];
EXTERNAL SIMPLE PROCEDURE TRANSFORM(REAL ARRAY R;REFERENCE REAL A;REAL ARRAY V);
EXTERNAL SIMPLE PROCEDURE INVERT(REFERENCE REAL R,A);
SIMPLE PROCEDURE COLVECT(REAL ARRAY R;INTEGER L,I);
BEGIN INTEGER K;
FOR K←1 STEP 1 UNTIL 3 DO R[K]←A[L+(K-1)*4+(I-1)];
R[4]←1.0;
END;
PUSH_FORMAT(9,1);
ARRBLT(F[1],FV[1],3);
ARRBLT(M[1],FV[4],3);
INVERT(INV[1,1],T[SQAR(6)]);
F[4]←M[4]←0.0;
TRANSFORM(F,INV[1,1],F);
TRANSFORM(M,INV[1,1],M);
A[3]←A[7]←0.0;
FOR L←6 STEP -1 UNTIL 1 DO
BEGIN
F[4]←M[4]←0.0;
TRANSFORM (F,A[SQAR(L)],F);
COLVECT(P,SQAR(L),4);
F[4]←1.0;
CROSS(P,P,F);
TRANSFORM(M,A[SQAR(L)],M);
M[4]←1.0;
PLUS(M,M,P);
REDUCE(M);
TQ[L]←IF L=3 THEN F[3] ELSE M[3];
END;
A[3]←A[3]+SHOLDER[1];
A[7]←A[7]+SHOLDER[2];
S←"JOINT TORQUES";
FOR I←1 STEP 1 UNTIL 6 DO S←S&(CVF(TQ[I]));
IF TYP_HAND THEN OUTSTR(S&CRLF&CRLF);
POP_FORMAT;
END;
PRELOAD_WITH
'400000200000,
'200000040000,
'100000010000,
'40000002000,
'20000000400,
'10000000100;
SAFE OWN INTEGER ARRAY GO_WORD[1:6];
SIMPLE PROCEDURE BITS(REFERENCE INTEGER DATWD;REAL SIGN;REFERENCE INTEGER DAT);
START_CODE
MOVE 3,-3('17);
MOVE 1,(3);
MOVE 2,@-1('17);
TDO 1,2;
TRZ 1,(2);
LSH 2,1;
SKIPGE -2('17);
TRO 1,(2);
MOVEM 1,(3);
END;
PROCEDURE FREE_JOINT(REFERENCE INTEGER DATWD);
BEGIN INTEGER NF,I,J,K;
REAL R,MAX;
SAFE OWN INTEGER ARRAY ZF[1:6];
SAFE OWN REAL ARRAY FV,TQ[1:6];
NF←FREE_ARM[0,1];
FOR I←1 STEP 1 UNTIL NF DO
BEGIN
ARRBLT(FV[1],FREE_ARM[I,1],6);
FORCE(TQ,FV);
MAX←0.0;
FOR J←1 STEP 1 UNTIL 6 DO
BEGIN LABEL L1;
IF J=BFJ THEN GO TO L1;
FOR K←1 STEP 1 UNTIL I-1 DO IF ZF[K]=J THEN GO TO L1;
IF (R←ABS(TQ[J]/F0[J]))>MAX THEN
BEGIN
MAX←R;
ZF[I]←J;
END;
L1: END;
BITS(DATWD,TQ[ZF[I]],GO_WORD[ZF[I]]);
END;
END;
SIMPLE INTEGER PROCEDURE RUNTIME(SAFE REAL ARRAY DTH);
BEGIN
INTEGER T,TIME,I;
TIME←0;
FOR I←1 STEP 1 UNTIL 6 DO BEGIN
T←ABS(DTH[I])*TIMFAC[I];
IF T>TIME THEN TIME←T END;
RETURN(TIME+(IF TIME THEN 20 ELSE 0));
END "RUNTIME";
SIMPLE PROCEDURE SCHEINMAN (SAFE REAL ARRAY RES,TH);
BEGIN
LABEL F2;
REAL M,IXX,IYY,IZZ;
SAFE OWN REAL ARRAY JI,TQ[1:6];
EXTERNAL REAL SIMPLE PROCEDURE INNER(REFERENCE REAL A,B);
REAL Z; INTEGER I,DIFF,J,K,L,TJ;
RES[1]←0;ARRBLT(RES[2],RES[1],6);
JI[1]←0;ARRBLT(JI[2],JI[1],5);
WAS_FORCED←FORCED;
FORCED←FALSE;
FORCED←OBJECT_MASS;
M←9.33*OBJECT_MASS+M6;
Z←(M6*Z6)/M;
IXX←I6XX+9.33*OBJECT_MASS*OBJECT_KXX↑2;
IYY←I6YY+9.33*OBJECT_MASS*OBJECT_KYY↑2;
IZZ←I6ZZ+9.33*OBJECT_MASS*OBJECT_KZZ↑2;
I←SQAR(6);
JMAT[I]←0.5*(-IXX+IYY+IZZ);
JMAT[I+5]←0.5*(IXX-IYY+IZZ);
JMAT[I+10]←0.5*(IXX+IYY-IZZ);
JMAT[I+11]←JMAT[I+14]←M*Z;
JMAT[I+15]←M;
COMPLETA(1,TH);
COMPLETA(2,TH);
A[SQAR(3)+11]←TH[3];
COMPLETA(4,TH);
COMPLETA(5,TH);
COMPLETA(6,TH);
UNDERFLOW(14);
MTIMES(U1[0],Q[0],A[0]);
MTIMES(D[0],U1[0],JMAT[0]);
JI[1]←TRACET(D[0],U1[0]);
MMOVE(T[0],A[0]);
for J ← 2 step 1 until 6 do begin
TJ←SQAR(J);
DIFF←IF J=3 THEN 17 ELSE 0;
MTIMES (QA[0], Q[DIFF], A[TJ]);
MTIMES (U1[TJ], T[SQAR(J-1)], QA[0]);
for I← 1 step 1 until J-1 do MTIMES (U1[SQAR(I)],U1[SQAR(I)], A[TJ]);
MTIMES(T[TJ],T[SQAR(J-1)],A[TJ]);
F2: FOR I←1 STEP 1 UNTIL J DO RES[I]←RES[I]
+0.107*INNER(U1[SQAR(I)+8],JMAT[TJ+12]);
For K← 1 step 1 until J do begin
MTIMES (D[0],U1[SQAR(K)],JMAT[TJ]);
JI[K]←JI[K] + TRACET(D[0],U1[SQAR(K)]);
END;
END;
T[88]←T[88]+SX;T[92]←T[92]+SY;
FOR I←1 STEP 1 UNTIL 6 DO IF FORCE_ARM[I] THEN BEGIN
FORCE(TQ,FORCE_ARM);
FORCED←TRUE;
FOR I←1 STEP 1 UNTIL 6 DO RES[I]←RES[I]+TQ[I];
DONE;
END;
FOR I←1 STEP 1 UNTIL 6 DO NOT_LESS(RES[I],1.0@-5);
IFC BLUE THENC
FOR I←1 STEP 1 UNTIL 6 DO RES[I]←(RES[I] LAND '777777000000) LOR (SQRT(JI[I]) LSH -18);
I←'770000252504;
ELSEC
FOR I←1 STEP 1 UNTIL 6 DO RES[I]←(RES[I] LAND '777777000000) LOR (SQRT(JI[I]) LSH -18);
I←'770000252502;
ENDC
IF NNUL THEN I←I+'1000000;
IF ¬(FORCED ∨ WAS_FORCED) THEN I←I+'2000000;
FREE_JOINT(I);
ARRBLT(RES[7],I,1);
UNDERFLOW(0);
END;
SIMPLE PROCEDURE FLUSH(BOOLEAN FINISH;SAFE REAL ARRAY TS);
BEGIN INTEGER N,J,I;
IF ¬FRST_OPEN ∨ FINISH
THEN BEGIN
FOR I←1 STEP 1 UNTIL FREEL
DO FOR J←1 STEP 1 UNTIL PTR3+1
DO IF EQU(REF[J],LABELS[I])
THEN BEGIN
IF (STACK[J] LAND '77000000 ) = '26000000 THEN BEGIN
N←PTRS[I]-J+COEFF[(STACK[J] LAND '777777)+1];
REF[J]←NULL;
IF N+J<1 ∨ N+J>PTR3+1
THEN BEGIN
OUTSTR(LABEL_LINE[I]&LABELS[I]&" OUT OF RANGE"&'15&'12);
N←PTR3+1-J END;
COEFF[(STACK[J] LAND '777777) +1]←N;
LABEL_LINE[I]←NULL END ELSE BEGIN
START_CODE
MOVE 1,STACK;
ADD 1,J;
HRRE 1,-1(1);
MOVEM 1,N END;
N←PTRS[I]-J+N;
REF[J]←NULL;
IF N+J<1 ∨ N+J>PTR3+1
THEN BEGIN
OUTSTR(LABEL_LINE[I]&LABELS[I]&" OUT OF RANGE"&'15&'12);
N←PTR3+1-J END;
STACK[J]←(N LAND '777777) LOR (STACK[J] LAND '777000000);
LABEL_LINE[I]←NULL END;END;
FOR I←1 STEP 1 UNTIL PTR3
DO IF LENGTH(REF[I])
THEN BEGIN OUTSTR(CODE_LINE[I]&REF[I]&" UNDEFINED"&'15&'12);
STACK[I]←(PTR3+1-I) LOR '102000000;
REF[I]←NULL;
LABEL_LINE[I]←NULL END;
FREEL←0;
FOR I←1 STEP 1 UNTIL PTR3 DO
IF (J←(STACK[I] LAND '777000000))='102000000 ∨ J='16000000 THEN BEGIN
START_CODE
MOVE 1,STACK;
ADD 1,I;
HRRE 1,-1(1);
MOVEM 1,N END;
IF ¬N ∨ N+I<1 ∨ N+I>PTR3+1 THEN BEGIN
OUTSTR(CODE_LINE[I]&"JUMP OUT OF RANGE"&CRLF);
STACK[I]←(PTR3+1-I) LOR '102000000 END;
END;
FOR I←1 STEP 1 UNTIL MAC DO BBEG[I]←LLAB[I]←1;
IF PTR3+PTR4≥PTR2 THEN USERERR(0,1,"TRAJECTORY FILE TOO LONG");
ARRBLT(COEFF[PTR4+1],STACK[1],PTR3);
COEFF[PTR4+PTR3+1]←0;
I←-(PTR4+1+(MASTER LSH 18));
ARRBLT(COEFF[0],I,1);
COEFF['1000]←0;
PTR4←PTR3←0;
PTR2←512;
FAST_WRITE;
END ELSE FRST_OPEN←FALSE;
IF FINISH THEN BEGIN
IF ¬FAST THEN RELEASE('16);
RETURN END;
ARRTRAN(TH,TS);
SCHEINMAN(DIAG,TH);
END;
SIMPLE PROCEDURE FLUSHP(INTEGER N;SAFE REAL ARRAY TH);
BEGIN FRST_OPEN←FALSE;
IF PTR3+PTR4+N≥PTR2 THEN FLUSH(0,TH);
END;
SIMPLE PROCEDURE REVOLVE(SAFE REAL ARRAY P,O; REAL TH);
BEGIN
SAFE OWN REAL ARRAY OP,A,T[1:4];
UNIT(O,O);
SCALE(OP,O,DOT(P,O));
DIFFERENCE(A,P,OP);
CROSS(T,O,A);
SCALE(T,T,SIND(TH));
SCALE(P,A,COSD(TH));
PLUS(P,P,T);
PLUS(P,P,OP);
REDUCE(P);
END;
PROCEDURE RESET_CONO;
BEGIN
FREE_ARM[0,1]←FORCE_ARM[1]←OBJECT_MASS←OBJECT_KXX←OBJECT_KYY←OBJECT_KZZ←0;
NNUL←0;
BFJ←0;
ARRBLT(FORCE_ARM[2],FORCE_ARM[1],5);
END;
EXTERNAL SIMPLE PROCEDURE PACK(REFERENCE INTEGER PTR;INTEGER PERIOD;REFERENCE REAL BUF);
SIMPLE PROCEDURE PACK_UP;
BEGIN
INTEGER P1,I,J,K;
REAL R1,R2;
SAFE OWN INTEGER ARRAY LOOPP,NXT,ALT[1:6];
SAFE OWN REAL ARRAY BUF[0:4];
COEFF[PTR4←PTR4+1]←DURATION;
STACK[PTR3←PTR3+1]←'21000000 LOR PTR4;
IF MERGE THEN
BEGIN
STACK[PTR3]←STACK[PTR3] LOR '400000000;
STACK[PTR3]↔STACK[PTR3-1];
MERGE←FALSE
END;
FOR JOINT←1 STEP 1 UNTIL 6 DO
BEGIN
ARRBLT(BUF[0],KOE[JOINT,1],5);
PACK(COEFF[PTR4←PTR4+4],PERIOD[JOINT,1],BUF[0]);
NXT[JOINT]←PTR4
END;
COEFF[PTR4←PTR4+1]←PTR2;
FOR JOINT←1 STEP 1 UNTIL 6 DO
BEGIN
BUF[4]←0;
FOR I←2 STEP 1 UNTIL NS[JOINT] DO
BEGIN
ARRBLT(BUF[0],KOE[JOINT,I*4-2],(IF I=NS[JOINT] THEN 5 ELSE 4));
PACK(COEFF[PTR4←PTR4+4],PERIOD[JOINT,I],BUF[0]);
COEFF[NXT[JOINT]]←(PTR4 LSH 18) LOR COEFF[NXT[JOINT]];
NXT[JOINT]←PTR4;
IF LOOP THEN
BEGIN
IF I=3 THEN LOOPP[JOINT]←PTR4;
IF I=6 THEN ALT[JOINT]←PTR4
END;
IF JOINT=6 THEN COEFF[PTR4←PTR4+1]←PTR2←PTR2-7
END;
IF LOOP THEN
BEGIN
BUF[0]←POSITION[JOINT,6];
FOR J←1 STEP 1 UNTIL 4 DO BUF[J]←KOE[JOINT,3*I-2+J];
PACK(COEFF[PTR4←PTR4+4],PERIOD[JOINT,3],BUF[0]);
NXT[JOINT]←PTR4;
COEFF[P1←ALT[JOINT]]←(PTR4 LSH 27) LOR COEFF[P1];
IF JOINT=6 THEN COEFF[P1+1]←'100000000000 LOR (LOOP LSH 18) LOR COEFF[P1+1];
IF JOINT=6 THEN COEFF[PTR4←PTR4+1]←499;
BUF[0]←POSITION[JOINT,0];
FOR J←1 STEP 1 UNTIL 4 DO BUF[J]←KOE[JOINT,3*I+2+J];
PACK(COEFF[PTR4←PTR4+4],PERIOD[JOINT,3],BUF[0]);
COEFF[NXT[JOINT]]←(PTR4 LSH 18) LOR COEFF[NXT[JOINT]];
COEFF[PTR4]←(LOOPP[JOINT] LSH 18) LOR COEFF[PTR4];
IF JOINT=6 THEN COEFF[PTR4←PTR4+1]←473
END
END;
END;
INTEGER SIMPLE PROCEDURE QUADROOT(REAL A0,A1,A2,A3;REFERENCE REAL ANG,T);BEGIN
REAL DISC,B;
INTEGER I;
IF A3 ∧ (DISC←(A2/(3*A3))↑2-A1/(3*A3))≥0 THEN DISC←SQRT(DISC) ELSE RETURN(0);
B←A2/(3*A3);
T←DISC-B;
FOR I←0,1 DO BEGIN
IF 0< T <1.0 THEN
BEGIN
ANG←(((A3*T)+A2)*T+A1)*T+A0;
IF ANG>STOP[JOINT,2] THEN BEGIN ANG←STOP[JOINT,2];RETURN(1) END;
IF ANG<STOP[JOINT,1] THEN BEGIN ANG←STOP[JOINT,1];RETURN(1) END;
END;
T←-(DISC+B);
END;
RETURN(0);
END;
IFC WAVE THENC
SIMPLE PROCEDURE STEP_ARM(INTEGER JOINT;REAL DTH;INTEGER TIME);
BEGIN
INTEGER I;
IF ARM_EXECUTE THEN RETURN;
FLUSHP(100,LAST_ARM);
FOR I←1 STEP 1 UNTIL 6 DO
BEGIN
POSITION[I,0]←LAST_ARM[I];
NS[I]←2;
PERIOD[I,1]←10;
PERIOD[I,2]←IF TIME>60 THEN TIME-10 ELSE 50;
IF I=JOINT THEN POSITION[I,1]←POSITION[I,2]←LAST_ARM[I]←LAST_ARM[I]+DTH
ELSE POSITION[I,1]←POSITION[I,2]←LAST_ARM[I];
END;
SCHEINMAN(DIAG,LAST_ARM);
ARRBLT(COEFF[PTR2←PTR2-7],DIAG[1],7);
IFC BLUE THENC
COEFF[PTR2+6]←GO_WORD[JOINT]+2;
ELSEC
COEFF[PTR2+6]←GO_WORD[JOINT]+2;
ENDC
IF NNUL THEN COEFF[PTR2+6]←COEFF[PTR2+6]+'1000000;
ARRBLT(COEFF[PTR2-7],COEFF[PTR2],7);
KOE[1,1]←0;
ARRBLT(KOE[1,2],KOE[1,1],6*((MAX_SEG*3)+6)-1);
PACK_UP;
DURATION←10;
END;
ELSEC
SIMPLE MESSAGE PROCEDURE SET_TRANS(STRING S;REAL ARRAY T);
BEGIN "SET_TRANS"
INTEGER PTR;
STRING SS;
SAFE OWN REAL ARRAY E[1:6];
UNSTRUCT(T,E);
PTR←HASH(S);
WHILE LENGTH(SS←TRANSNAM[PTR]) ∧ ¬EQU(SS,S) DO PTR←REHASH;
IF ¬LENGTH(SS)
THEN BEGIN
IF FREE_DATA+2>FREE_DATA_LENGTH THEN RETURN;
TRANSNAM[PTR]←S;
TRANSNUM[PTR]←FREE_DATA;
FREE_DATA←FREE_DATA+2 END;
ARRBLT(DATA_BASE[TRANSNUM[PTR],1],E[1],6)
END "SET_TRANS";
SIMPLE MESSAGE PROCEDURE SET_VECT(STRING S;REAL ARRAY V);
BEGIN "SET_VECT"
INTEGER PTR;
STRING SS;
PTR←HASH(S);
WHILE LENGTH(SS←VECTNAM[PTR]) ∧ ¬EQU(SS,S) DO PTR←REHASH;
IF ¬LENGTH(SS)
THEN BEGIN
IF FREE_DATA+1>FREE_DATA_LENGTH THEN RETURN;
VECTNAM[PTR]←S;
VECTNUM[PTR]←FREE_DATA;
FREE_DATA←FREE_DATA+1 END;
ARRBLT(DATA_BASE[VECTNUM[PTR],1],V[1],3)
END "SET_VECT";
SIMPLE MESSAGE PROCEDURE GET_TRANS(STRING S;REAL ARRAY T);
BEGIN "GET_TRANS"
INTEGER PTR;
STRING SS;
SAFE OWN REAL ARRAY E[1:6];
PTR←HASH(S);
WHILE LENGTH(SS←TRANSNAM[PTR]) ∧ ¬EQU(SS,S) DO PTR←REHASH;
IF ¬LENGTH(SS) THEN RETURN;
ARRBLT(E[1],DATA_BASE[TRANSNUM[PTR],1],6);
CONSTRUCT(T,E)
END "GET_TRANS";
SIMPLE MESSAGE PROCEDURE GET_VECT(STRING S;REAL ARRAY V);
BEGIN "GET_VECT"
INTEGER PTR;
STRING SS;
PTR←HASH(S);
WHILE LENGTH(SS←VECTNAM[PTR]) ∧ ¬EQU(SS,S) DO PTR←REHASH;
IF ¬LENGTH(SS) THEN RETURN;
ARRBLT(V[1],DATA_BASE[VECTNUM[PTR],1],3);
V[4]←1.0
END "GET_VECT";
ENDC
PROCEDURE POLY (REAL ARRAY COEFFS; INTEGER #SEGS;
REAL ARRAY LOCS; INTEGER ARRAY TAU; REAL FST_VEL, LST_VEL, FST_ACC, LST_ACC;
INTEGER UNC1, UNC2);
BEGIN COMMENT: A trajectory is to be calculated. It is
composed of #SEGS segments, each to be a third degree poly-
nomial. The coefficients of the resulting polynomials will
fill COEFFS[1:N], where N is 4*#SEGS. At each point, 0 to
#SEGS, there is a given location in LOCS, except for points
UNC1 and UNC2, the unconstrained points. The velocities and
accelerations of the first and last points are also given:
these are FST_VEL, LST_VEL, FST_ACC, and LST_ACC.
The calculation depends on the array TAU[1:#SEGS], which
holds the time for each segment;
SAFE REAL ARRAY A, LU [1:4*#SEGS,1:4*#SEGS];
SAFE REAL ARRAY B [1:4*#SEGS];
COMMENT: A is the large matrix and B is the vector.
We will solve Ax=B;
INTEGER ROW, COL, SEG, N;
N ← 4 * #SEGS;
UNC1 ← UNC1 + 1;
UNC2 ← UNC2 + 1;
COMMENT: Zero the arrays;
B[1] ← A[1,1] ← 0.;
ARRBLT(B[2],B[1],N-1);
ARRBLT(A[1,2],A[1,1],N*N-1);
ROW ← COL ← 1;
SEG ← 1;
COMMENT: Fill the matrix for the first segment;
A[ROW,COL] ← A[ROW+1,COL+1] ← 1.;
A[ROW+2,COL+2] ← 2.;
B[ROW] ← LOCS[0];
B[ROW+1] ← TAU[SEG] * FST_VEL;
B[ROW+2] ← TAU[SEG]↑2 * FST_ACC;
ROW ← ROW + 3;
COL ← COL + 4;
FOR SEG ← 2 STEP 1 UNTIL #SEGS DO
IF SEG=UNC1 ∨ SEG=UNC2
THEN BEGIN "UNCNST" COMMENT: Left of segment
is an unconstrained point;
A[ROW,COL] ← 1.;
A[ROW,COL-1] ← A[ROW,COL-2] ← A[ROW,COL-3]
← A[ROW,COL-4] ← A[ROW+1,COL-3]
← A[ROW+2,COL-2] ← -1.;
A[ROW+1,COL-1] ← A[ROW+2,COL-1] ← -3.;
A[ROW+1,COL-2] ← -2.;
A[ROW+2,COL+2] ← (A[ROW+1,COL+1] ← TAU[SEG-1]
/TAU[SEG])↑2;
ROW ← ROW + 3;
COL ← COL + 4;
END
ELSE BEGIN "CNST" COMMENT: Left of segment is a
constrained point;
A[ROW,COL-1] ← A[ROW,COL-2]
← A[ROW,COL-3] ← A[ROW,COL-4] ← A[ROW+1,COL] ← 1.;
A[ROW+2,COL-3] ← A[ROW+3,COL-2] ← -1.;
A[ROW+2,COL-1] ← A[ROW+3,COL-1] ← -3.;
A[ROW+2,COL-2] ← -2.;
A[ROW+3,COL+2] ← (A[ROW+2,COL+1] ← TAU[SEG-1] /
TAU[SEG])↑2;
B[ROW] ← B[ROW+1] ← LOCS[SEG-1];
ROW ← ROW + 4;
COL ← COL + 4;
END;
COMMENT: Take care of the constraints at the final point;
COL ← COL - 4;
A[ROW,COL] ← A[ROW,COL+1] ← A[ROW,COL+2] ← A[ROW,COL+3]
← A[ROW+1,COL+1] ← 1.;
A[ROW+1,COL+2] ← A[ROW+2,COL+2] ← 2.;
A[ROW+1,COL+3] ← 3.;
A[ROW+2,COL+3] ← 6.;
B[ROW] ← LOCS[#SEGS];
B[ROW+1] ← TAU[#SEGS] * LST_VEL;
B[ROW+2] ← TAU[#SEGS]↑2 * LST_ACC;
ROW ← ROW + 3;
COL ← COL + 4;
IF ROW ≠ COL ∨ ROW ≠ N + 1 THEN OUTSTR("ERROR IN POLY"&CRLF);
DECOMPOSE(N,A,LU);
SOLVE(N,LU,B,COEFFS);
END;
PRELOAD_WITH 0.5, 0.5, 0.25, 1.0, 1.0, 2.5;
SAFE REAL ARRAY OSHOOT[1:6];
BOOLEAN SIMPLE PROCEDURE OVERSHOOT(REAL A3,A4,DELTA,OFF;REFERENCE REAL T,D);
RETURN( A4 ∧ OFF< (T←-(3*A3)/(4*A4)) <1+OFF ∧(D←(A4*T+A3)*T↑3/ABS(T))
∧ (IF D*DELTA>0 THEN (D←DELTA-D) ELSE (D←-D)));
IFC THROWING THENC REQUIRE "THROW.SAI" SOURCE_FILE; ENDC
INTEGER SIMPLE PROCEDURE KISEKI;BEGIN
INTEGER P2S,N,I,J;
INTEGER FREE1,FREE2;
REAL LOV,SDV,ANG,T;
SIMPLE PROCEDURE BUMP_UP(INTEGER I;REAL ANG,T);
BEGIN
INTEGER J;
FOR J←MAX_SEG STEP -1 UNTIL I+1 DO
BEGIN
POSITION[JOINT,J]←POSITION[JOINT,J-1];
PERIOD[JOINT,J]←PERIOD[JOINT,J-1]
END;
POSITION[JOINT,I]←ANG;
PERIOD[JOINT,I]←T*PERIOD[JOINT,I];
IF PERIOD[JOINT,I]<1 THEN PERIOD[JOINT,I]←1;
PERIOD[JOINT,I+1]←PERIOD[JOINT,I+1]-PERIOD[JOINT,I];
IF I≤FREE1 THEN FREE1←FREE1+1;
IF I≤FREE2 THEN FREE2←FREE2+1;
END;
P2S←PTR2-7;
FOR JOINT←1 STEP 1 UNTIL 6 DO
BEGIN
COMMENT FREE1 AND FREE2 POINT TO UNCONSTRAINED TRAJ POINTS;
FREE1←2;
FREE2←3;
COMMENT NUMBER OF SEGMENTS;
N←NS[JOINT];
COMMENT LiftOffVelocity ans SetDownVelocity;
LOV←2*(POSITION[JOINT,1]-POSITION[JOINT,0]);
SDV←2*(POSITION[JOINT,5]-POSITION[JOINT,4]);
ARRBLT(POS[0],POSITION[JOINT,1],4);
ARRBLT(TIM[1],PERIOD[JOINT,2],3);
POLY(SOLN,3,POS,TIM,LOV/PERIOD[JOINT,1],SDV/PERIOD[JOINT,5],0,0,1,2);
COMMENT CHECK FOR OVERSHOOT;
FOR I←4 STEP -1 UNTIL 2 DO
BEGIN
J←(I*4)-7;
IF QUADROOT(SOLN[J],SOLN[J+1],
SOLN[J+2],SOLN[J+3],ANG,T)
THEN BEGIN
BUMP_UP(I,ANG,T);
N←NS[JOINT]←NS[JOINT]+1;
FOR J←FREE1,FREE2 DO
BEGIN
I←PERIOD[JOINT,J]+PERIOD[JOINT,J+1];
PERIOD[JOINT,J+1]←I/2;
PERIOD[JOINT,J]←I-PERIOD[JOINT,J+1];
END;
ARRBLT(POS[0],POSITION[JOINT,1],N-1);
ARRBLT(TIM[1],PERIOD[JOINT,2],N-2);
POLY(SOLN,N-2,POS,TIM,LOV/PERIOD[JOINT,1],SDV/PERIOD[JOINT,N],
0,0,FREE1-1,FREE2-1);
DONE;
END;
END;
POSITION[JOINT,FREE1]←SOLN[FREE1*4-3];
POSITION[JOINT,FREE2]←SOLN[FREE2*4-3];
ARRBLT(KOE[JOINT,6],SOLN[1],(N-2)*4);
KOE[JOINT,1]←POSITION[JOINT,0];
KOE[JOINT,2]←KOE[JOINT,3]←KOE[JOINT,N*4]←0;
KOE[JOINT,4]←LOV;
KOE[JOINT,5]←-LOV/2;
KOE[JOINT,N*4-2]←POSITION[JOINT,N-1];
KOE[JOINT,N*4-1]←SDV;
KOE[JOINT,N*4+1]←-SDV;
KOE[JOINT,N*4+2]←SDV/2;
END;
FOR I←1 STEP 1 UNTIL N←NS[6] DO
BEGIN
FOR J←1 STEP 1 UNTIL 6 DO TH[J]←POSITION[J,0.5+(NS[J]*I)/N];
SCHEINMAN(DIAG,TH);
DIAG[7]←DIAG[7] LOR '2000000;
ARRBLT(COEFF[PTR2←PTR2-7],DIAG[1],7);
END;
PTR2←P2S;
PACK_UP;
RETURN(0) END;
PROCEDURE TRAJECTORY(REAL ARRAY T0,TF,TRANS);
BEGIN
INTEGER MT,I,J,N;
REAL INT,R;
SAFE REAL ARRAY AI,AF,DTH[1:6];
SAFE REAL ARRAY DV[1:4];
INTEGER TR1,TR2;
PROCEDURE LIFTOFF(REAL ARRAY T0,T,DEP,DTH; REFERENCE INTEGER TR);
BEGIN REAL ARRAY TT[1:4,1:4];
INTEGER I,J;
REAL R;
ARRTRAN(DTH,T0);
ARRTRAN(TT,T);
FOR I←1 STEP 1 UNTIL 3 DO TT[I,4]←T[I,4]+DEP[I];
ARM_SOLVE(TT,DTH);
FOR I←1 STEP 1 UNTIL 6 DO
BEGIN
DTH[I]←DTH[I]-T0[I];
R←2*DTH[I]+T0[I];
IF (STOP[I,1]-R)*(R-STOP[I,2])<0.0
THEN BEGIN
FOR J←1,2 DO
IF (R-STOP[I,J])*(STOP[I,J]-T0[I])≥0
THEN BEGIN
DTH[I]←DTH[I]*.9*(STOP[I,J]-T0[I])/(R-T0[I]);
DONE;
END;
END;
END;
TR←IF T1_ARM>0 THEN T1_ARM ELSE RUNTIME(DTH);
IF T1_ARM ≤0 THEN TR←IF (R←15*SQRT(MAGNITUDE(DEP)))>TR THEN R ELSE TR;
END;
FLUSHP(150,T0);
LIFTOFF(T0,LAST_TRANS,DEPART_ARM,AI,TR1);
LIFTOFF(TF,TRANS,ARRIVE_ARM,AF,TR2);
FOR I←1 STEP 1 UNTIL 6 DO DTH[I]←TF[I]+AF[I]-T0[I]-AI[I];
PLUS(DV,ARRIVE_ARM,DEPART_ARM);
R←10*SQRT(MAGNITUDE(DV));
COMMENT MINIMUN TIME TO ACCOMPLISH CHANGE IN VELOCITY;
N←IF T2_ARM>0 THEN T2_ARM ELSE RUNTIME(DTH)+R;
FOR I←1 STEP 1 UNTIL 6 DO BEGIN
POSITION[I,0]←T0[I];
POSITION[I,1]←T0[I]+AI[I];
POSITION[I,4]←TF[I]+AF[I];
POSITION[I,5]←TF[I];
NS[I]←5;
PERIOD[I,1]←TR1;
PERIOD[I,2]←PERIOD[I,3]←N/3;
PERIOD[I,4]←N-PERIOD[I,2]-PERIOD[I,3];
PERIOD[I,5]←TR2 END;
LOOP←0;
DURATION←N;
IF KISEKI THEN USERERR(0,1,"OVERSHOOT");
ARRTRAN(LAST_ARM,TF);
ARRTRAN(LAST_PLANNED_ARM,TF);
ARM_TIME←ARM_TIME+N+TR1*2;
ARRTRAN(DEPART_ARM,ARRIVE_ARM);
FOR I←1 STEP 1 UNTIL 3 DO ARRIVE_ARM[I]←IF I=3 THEN 3.0 ELSE 0.0;
T1_ARM←T2_ARM←0;
RESET_CONO;
END;
BOOLEAN SIMPLE PROCEDURE IS_NOT_CLEAR(SAFE REAL ARRAY TRANS,J);
BEGIN SAFE OWN REAL ARRAY IP[1:4];
REAL R;
BOOLEAN SIMPLE PROCEDURE NOT_CLEAR(REFERENCE REAL J;SAFE REAL ARRAY V);
BEGIN SAFE OWN REAL ARRAY VT[1:4];
EXTERNAL SIMPLE PROCEDURE TRANSFORM(REAL ARRAY V;REFERENCE REAL T;REAL ARRAY F);
TRANSFORM(VT,J,V);
IF VT[3]<0.375 THEN RETURN(TRUE);
IF (VT[1]-SHOLDER[1])↑2+(VT[2]-SHOLDER[2])↑2<25.0 THEN RETURN(TRUE) ELSE RETURN(FALSE);
END;
IP[1]←IP[3]←0.0;IP[4]←1.0;
FOR R←-2.0,2.0 DO BEGIN IP[2]←R;IF NOT_CLEAR(TRANS[1,1],IP)THEN RETURN(TRUE);END;
ARRTRAN(J,LAST_ARM);
J[4]←-90.0;J[6]←0;
IF PSOLVE(TRANS,J) THEN RETURN (TRUE);
HANDPOS(J);
IP[2]←0.0;
FOR R←3.0,-3.0 DO BEGIN IP[3]←R;IF NOT_CLEAR(T[SQAR(4)],IP) THEN RETURN(TRUE);END;
IP[3]←-38.0;
IF NOT_CLEAR(T[SQAR(3)],IP) THEN RETURN(TRUE) ELSE RETURN(FALSE);
END;
SIMPLE MESSAGE PROCEDURE TO_ARM(REAL ARRAY T;REFERENCE INTEGER FLAG);
BEGIN SAFE OWN REAL ARRAY J[1:6];
SAFE OWN REAL ARRAY EXF[1:7];
INTEGER K;
FLAG←0;
IF IS_NOT_CLEAR(T,J) THEN BEGIN ARM_EXECUTE←FALSE; RETURN END;
FLAG←-1;
IF ARM_EXECUTE THEN BEGIN
ARM_MESSAGE[21]←'17000000;
ARRBLT(ARM_MESSAGE[1],T[1,1],12);
SCHEINMAN(EXF,J);
ARRBLT(ARM_MESSAGE[14],EXF[1],7);
ARM_MESSAGE[13]←T2_ARM;
RESET_CONO;
ARMFN(20);
ARM_EXECUTE←FALSE;
UPDATE_SEG;
RETURN END;
FLUSHP(30,LAST_ARM);
PTR3←PTR3+1;
IF MERGE THEN BEGIN
STACK[PTR3]←'417000000+(PTR4←PTR4+1);
STACK[PTR3]↔STACK[PTR3-1];
MERGE←FALSE END ELSE
STACK[PTR3]←'17000000+(PTR4←PTR4+1);
ARRBLT(COEFF[PTR4],T[1,1],12);
COEFF[PTR4←PTR4+12]←T2_ARM;
SCHEINMAN(DIAG,J);
ARRBLT(COEFF[PTR4←PTR4+1],DIAG[1],7);
PTR4←PTR4+6;
ARRTRAN(LAST_ARM,J);
ARM_TIME←ARM_TIME+T2_ARM;
ARRTRAN(LAST_PLANNED_ARM,J);
ARRTRAN(LAST_PLANNED_TRANS,T);
ARRTRAN(LAST_TRANS,T);
ARRTRAN(DEPART_ARM,ARRIVE_ARM);
FOR I←1 STEP 1 UNTIL 3 DO ARRIVE_ARM[I]←IF I=3 THEN 3.0 ELSE 0.0;
T1_ARM←T2_ARM←0;
RESET_CONO;
END;
SIMPLE MESSAGE PROCEDURE MOVE_ARM(REAL ARRAY T;REFERENCE INTEGER FLAG);
BEGIN SAFE OWN REAL ARRAY J[1:6];
IF ARM_EXECUTE THEN BEGIN TO_ARM(T,FLAG); RETURN END;
FLAG←0;
IF IS_NOT_CLEAR(T,J) THEN BEGIN ARM_EXECUTE←FALSE; RETURN END;
FLAG←-1;
TRAJECTORY(LAST_ARM,J,T);
ARRTRAN(LAST_TRANS,T);
ARRTRAN(LAST_PLANNED_TRANS,T);
END;
SIMPLE MESSAGE PROCEDURE GO_ARM(REAL ARRAY T;REFERENCE INTEGER FLAG);
BEGIN SAFE OWN REAL ARRAY TF[1:6];
INTEGER K,TIME,MT,I,J,NNULS;
REAL INT,R;
SAFE OWN REAL ARRAY TH,DTH,AI,AF[1:6];
SAFE OWN REAL ARRAY T1,T2[1:4,1:4];
INTEGER TR1,TR2;
SIMPLE PROCEDURE LIFTOFF(REAL ARRAY T0,T,DEP,DTH; REFERENCE INTEGER TR);
BEGIN REAL OWN ARRAY TT[1:4,1:4];
INTEGER I,J;
REAL R;
ARRTRAN(DTH,T0);
ARRTRAN(TT,T);
FOR I←1 STEP 1 UNTIL 3 DO TT[I,4]←T[I,4]+DEP[I];
ARM_SOLVE(TT,DTH);
FOR I←1 STEP 1 UNTIL 6 DO DTH[I]←DTH[I]-T0[I];
TR←IF T1_ARM>0 THEN T1_ARM ELSE RUNTIME(DTH);
IF T1_ARM ≤0 THEN TR←IF (R←15*SQRT(MAGNITUDE(DEP)))>TR THEN R ELSE TR;
END;
IF ARM_EXECUTE THEN BEGIN TO_ARM(T,FLAG); RETURN END;
FLAG←0;
IF IS_NOT_CLEAR(T,TF) THEN BEGIN ARM_EXECUTE←FALSE;RETURN END;
FLAG←-1;
FLUSHP(90,LAST_ARM);
LIFTOFF(LAST_ARM,LAST_TRANS,DEPART_ARM,AI,TR1);
LIFTOFF(TF,T,ARRIVE_ARM,AF,TR2);
PTR3←PTR3+1;
IF MERGE THEN BEGIN
STACK[PTR3]←'420000000+(PTR4←PTR4+1);
STACK[PTR3]↔STACK[PTR3-1];
MERGE←FALSE END ELSE
STACK[PTR3]←'20000000+(PTR4←PTR4+1);
INVERT(T1,LAST_TRANS);
MOVET(T2,LAST_TRANS);
FOR I←1 STEP 1 UNTIL 3 DO T2[I,4]←T2[I,4]+DEPART_ARM[I];
TIMES(T1,T1,T2);
ARRBLT(COEFF[PTR4],T1[1,1],12);
COEFF[PTR4←PTR4+12]←TR1;
INVERT(T1,T);
MOVET(T2,T);
FOR I←1 STEP 1 UNTIL 3 DO T2[I,4]←T2[I,4]+ARRIVE_ARM[I];
TIMES(T1,T1,T2);
ARRBLT(COEFF[PTR4←PTR4+1],T1[1,1],12);
COEFF[PTR4←PTR4+12]←T2_ARM;
ARRBLT(COEFF[PTR4←PTR4+1],T[1,1],12);
COEFF[PTR4←PTR4+12]←TR2;
FOR I←1 STEP 1 UNTIL 6 DO TH[I]←LAST_ARM[I]+AI[I];
SCHEINMAN(DIAG,TH);
ARRBLT(COEFF[PTR4←PTR4+1],DIAG[1],7);
FOR I←1 STEP 1 UNTIL 6 DO TH[I]←TF[I]+AF[I];
SCHEINMAN(DIAG,TH);
DIAG[7]←DIAG[7] LOR '2000000;
ARRBLT(COEFF[PTR4←PTR4+7],DIAG[1],7);
SCHEINMAN(DIAG,TF);
DIAG[7]←DIAG[7] LOR '2000000;
ARRBLT(COEFF[PTR4←PTR4+7],DIAG[1],7);
PTR4←PTR4+6;
ARRTRAN(LAST_ARM,TF);
ARM_TIME←ARM_TIME+T2_ARM+TR1+TR2;
ARRTRAN(LAST_PLANNED_ARM,TF);
ARRTRAN(LAST_PLANNED_TRANS,T);
ARRTRAN(LAST_TRANS,T);
ARRTRAN(DEPART_ARM,ARRIVE_ARM);
FOR I←1 STEP 1 UNTIL 3 DO ARRIVE_ARM[I]←IF I=3 THEN 3.0 ELSE 0.0;
T1_ARM←T2_ARM←0;
RESET_CONO;
END;
SIMPLE MESSAGE PROCEDURE DRAW_ARM(REAL ARRAY PROFILE;INTEGER STAT);
BEGIN
SAFE OWN REAL ARRAY DTH[1:6];
SAFE OWN REAL ARRAY FAS[0:6,1:6];
SAFE OWN REAL ARRAY ROTS,ROTA,RS,IP,RV,CV,FVV,FV,VT,DIFF[1:4];
REAL AR,RR,THP4,R,MAX;
INTEGER TIME,NF,I,J,K,NT;
EXTERNAL SIMPLE PROCEDURE MOVEV(REAL ARRAY R;REFERENCE REAL A);
IF ARM_EXECUTE THEN BEGIN STAT←4;ARM_EXECUTE←FALSE;RETURN END;
ARRTRAN(TRANS,LAST_TRANS);
CVV(IP,LAST_TRANS,4);
ARRTRAN(FAS,FREE_ARM);
MOVEV(DIFF,PROFILE[1,1]);
MOVEV(RV,PROFILE[2,1]);
IF(AR←IF MAGNITUDE(RV) THEN PROFILE[3,1] ELSE 0) THEN UNIT(RV,RV);
MOVEV(ROTA,PROFILE[5,1]);
IF(RR←IF MAGNITUDE(ROTA) THEN PROFILE[3,2] ELSE 0)
THEN BEGIN UNIT(ROTA,ROTA);
MOVEV(ROTS,PROFILE[4,1]);
DIFFERENCE(IP,IP,ROTS) END;
FVV[1]←FV[1]←FORCE_ARM[1];
FVV[2]←FV[2]←FORCE_ARM[2];
FVV[3]←FV[3]←FORCE_ARM[3];
FVV[4]←FV[4]←1.0;
FLUSH(0,LAST_ARM);
SCHEINMAN(DIAG,LAST_ARM);
ARRBLT(COEFF[PTR2←PTR2-7],DIAG[1],7);
FRST_OPEN←TRUE;
R←0;
IF PROFILE[0,3] THEN LOOP←PROFILE[0,3]-1;
IF LOOP THEN NT←8 ELSE BEGIN
NT←4;
R←MAGNITUDE(DIFF);
IF R>15.0 THEN NT←(R/5)+0.5;
NT←IF (MAX←AR/60.0)>NT THEN MAX ELSE NT;
NT←IF (MAX←RR/60.0)>NT THEN MAX ELSE NT END;
IF TYP_HAND THEN OUTSTR(CVS(NT)&" PART TRAJECTORY"&CRLF);
IF NT>8 THEN BEGIN STAT←3;RETURN END;
FOR J←1 STEP 1 UNTIL 6 DO TH[I]←POSITION[J,0]←LAST_ARM[J];
FOR I←1 STEP 1 UNTIL NT DO
BEGIN
R←IF I=1
THEN 1/(3*(NT-2))
ELSE (I-1)/(NT-2);
R←IF I=NT-1
THEN R-1/(3*(NT-2))
ELSE IF I=NT
THEN 1.0
ELSE R;
SCALE(VT,DIFF,R);
PLUS(VT,VT,IP);
IF RR THEN BEGIN ROTATE(RS,ROTS,ROTA,R*RR);
PLUS(VT,VT,RS)END;
REDUCE(VT);
CVC(TRANS,4,VT);
IF AR THEN FOR J←1 STEP 1 UNTIL 3 DO BEGIN
CVV(CV,LAST_TRANS,J);
REVOLVE(CV,RV,R*AR);
CVC(TRANS,J,CV) END;
IF (STAT←ARM_SOLVE(TRANS,TH)) THEN RETURN;
FOR J←1 STEP 1 UNTIL 6 DO BEGIN
POSITION[J,I]←TH[J];
DTH[I]←POSITION[J,I]-POSITION[J,I-1] END;
IF (K←RUNTIME(DTH))*NT > PROFILE[0,2] THEN PROFILE[0,2]←K*NT;
IF RR THEN BEGIN
FOR K←1 STEP 1 UNTIL FAS[0,1] DO
BEGIN
MOVEV(VT,FAS[K,1]);
VT[4]←1.0;
IF MAGNITUDE(VT)>0.0 THEN
BEGIN
REVOLVE(VT,ROTA,R*RR);
REDUCE(VT);
FOR J←1 STEP 1 UNTIL 3 DO FREE_ARM[K,J]←VT[J] END END;
MOVEV(FV,FVV[1]);
REVOLVE(FV,ROTA,R*RR);
REDUCE(FV);
ARRBLT(FORCE_ARM[1],FV[1],3) END;
SCHEINMAN(DIAG,TH);
ARRBLT(COEFF[PTR2←PTR2-7],DIAG[1],7);
END;
TIME←(PROFILE[0,2]/NT)+0.5;
FOR JOINT←1 STEP 1 UNTIL 6 DO BEGIN
NS[JOINT]←NT;
FOR J←1 STEP 1 UNTIL NT DO PERIOD[JOINT,J]←TIME;
ARRBLT(POS[0],POSITION[JOINT,0],NS[JOINT]+1);
ARRBLT(TIM[1],PERIOD[JOINT,1],NS[JOINT]);
OUTSTR("DRAW DOSNT WORK");
COMMENT POLY(NS[JOINT]);
ARRBLT(KOE[JOINT,1],SOLN[1],(NS[JOINT]*3)+6) END;
PTR2←486;
PACK_UP;
DURATION←TIME;
ARRTRAN(LAST_ARM,TH);
ARRTRAN(LAST_TRANS,TRANS);
ARRTRAN(LAST_PLANNED_ARM,TH);
ARRTRAN(LAST_PLANNED_TRANS,TRANS);
ARM_TIME←ARM_TIME+TIME*((NT-2)*LOOP+2);
STAT←0;
RESET_CONO;
FRST_OPEN←FALSE;
END;
SIMPLE MESSAGE PROCEDURE START_TRAJECTORY(STRING FILE;INTEGER START);
BEGIN
STRING S;
LABEL FIND,NONE,FOUND;
REAL R;
INTEGER I;
FRST_OPEN←TRUE;
ARM_TIME←0;
IF ¬START THEN ARRTRAN(LAST_ARM,ARM_VECTOR);
ARRTRAN(LAST_PLANNED_ARM,LAST_ARM);
HANDPOS(LAST_ARM);
ARRBLT(LAST_TRANS[1,1],T[SQAR(6)],16);
ARRTRAN(LAST_PLANNED_TRANS,LAST_TRANS);
FOR I←1 STEP 1 UNTIL 3 DO ARRIVE_ARM[I]←DEPART_ARM[I]←IF I=3 THEN 3.0 ELSE 0.0;
RESET_CONO;
IF FAST THEN BEGIN
FIND: IF NEXT_BAND>'37 THEN GO TO NONE;
FOR BAND←0 STEP 1 UNTIL NEXT_BAND-1 DO IF EQU(FILE,BANDS[BAND])THEN GO TO FOUND;
TRACK[BAND]←CALL('100000000000 LOR BAND,"UFBGET");
IF ¬_SKIP_ THEN GO TO NONE;
NEXT_BAND←BAND+1;
BANDS[BAND]←FILE;
FOUND: GOODIE[3]←0;
BAND_NUMBER←TRACK[BAND];
END ELSE NONE:BEGIN
FAST←FALSE;
OPEN('16,"DSK",'17,0,0,120,BREAK,EOF);
ENTER('16,FILE&".TRJ",BREAK);
END;
COEFF[0]←0; ARRBLT(COEFF[1],COEFF[0],'1037);
PTR4←PTR3←0;
PTR2←512;
END;
SIMPLE MESSAGE PROCEDURE CLOSE_TRAJECTORY;
FLUSH(1,TH);
SIMPLE MESSAGE PROCEDURE ARM_POSITION(STRING SAVE_CELL);
BEGIN
IF LENGTH(SAVE_CELL)
THEN BEGIN
TRANS_ARM[4,1]←TRANS_ARM[4,2]←TRANS_ARM[4,3]←0;
TRANS_ARM[4,4]←1
END;
ARMPOS(CVSIX(SAVE_CELL));
UPDATE_SEG;
END;
SIMPLE MESSAGE PROCEDURE OPEN_HAND(REAL OPENING);
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[1]←'1000000 LOR (OPENING LSH -18);
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN
FLUSHP(150,LAST_ARM);
STACK[PTR3←PTR3+1]←'1000000 LOR (OPENING LSH -18) END;
SIMPLE MESSAGE PROCEDURE WOBBLE_HAND(REAL WOBBLEING);
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[1]←'14000000 LOR (WOBBLEING LSH -18);
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN FLUSHP(1,LAST_ARM);STACK[PTR3←PTR3+1]←'14000000 LOR (WOBBLEING LSH -18) END;
SIMPLE MESSAGE PROCEDURE PLACE_ARM;
BEGIN SAFE OWN REAL ARRAY DIR[1:4],DTH[1:6];
INTEGER I;
FOR I←1 STEP 1 UNTIL 3 DO DIR[I]←IF I=3 THEN -0.03 ELSE 0;
DIR[4]←1.0;
INCREMENT(DTH,DIR,FALSE);
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[7]←'4000000;
ARRBLT(ARM_MESSAGE[1],DTH[1],6);
ARMFN(6);
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN FLUSHP(7,LAST_ARM);
STACK[PTR3←PTR3+1]←'4000000+(PTR4←PTR4+1);
ARRBLT(COEFF[PTR4],DTH[1],6);
PTR4←PTR4+5 END;
END;
SIMPLE MESSAGE PROCEDURE SEARCH_ARM(REAL SIZE;REAL ARRAY N,F);
BEGIN SAFE OWN REAL ARRAY SEC[1:4];
IF ARM_EXECUTE THEN BEGIN ARM_EXECUTE←FALSE; RETURN END;
CROSS(SEC,N,F);
UNIT(F,F);
UNIT(SEC,SEC);
SCALE(F,F,SIZE);
SCALE(SEC,SEC,SIZE);
REDUCE(F);
REDUCE(SEC);
FLUSHP(40,LAST_ARM);
STACK[PTR3←PTR3+1]←'15000000+(PTR4←PTR4+1);
ARRBLT(COEFF[PTR4],F[1],3);
ARRBLT(COEFF[PTR4←PTR4+3],SEC[1],3);
ARRBLT(COEFF[PTR4←PTR4+3],LAST_PLANNED_TRANS[1,1],12);
ARRBLT(COEFF[PTR4←PTR4+12],LAST_PLANNED_ARM[1],6);
PTR4←PTR4+6;
END;
SIMPLE MESSAGE PROCEDURE PARK_ARM;
BEGIN INTEGER K;
IF ¬ARM_EXECUTE THEN
BEGIN
ARRIVE_ARM[3]←0.0;
GO_ARM(PARK_TRANS,K);
END ELSE TO_ARM(PARK_TRANS,K);
END;
SIMPLE MESSAGE PROCEDURE WAIT_ARM(STRING S);
IF ¬ARM_EXECUTE THEN BEGIN
FLUSHP(16,LAST_ARM);
STACK[PTR3←PTR3+1]←'3000000+(PTR4←PTR4+1);
PTR4←PTR4+PSTRING(COEFF[PTR4],S[1 FOR 74]);
END ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE CLOSE_HAND(REAL DIST);
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[1]←'2000000 LOR (DIST LSH -18);
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN FLUSHP(150,LAST_ARM);STACK[PTR3←PTR3+1]←'2000000 LOR (DIST LSH -18)END;
SIMPLE MESSAGE PROCEDURE CENTER_HAND(REAL DIST);
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[1]←'12000000 LOR (DIST LSH -18);
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN FLUSHP(150,LAST_ARM);STACK[PTR3←PTR3+1]←'12000000 LOR (DIST LSH -18)END;
SIMPLE MESSAGE PROCEDURE CHANGE_ARM(REAL ARRAY DIR;REAL DIST;
REAL ARRAY AXIS;REAL DEG;INTEGER TIME;REFERENCE INTEGER FLAG);
BEGIN INTEGER J,N;
SAFE OWN REAL ARRAY AV[1:6];
SAFE OWN REAL ARRAY EXF[1:7];
SAFE OWN REAL ARRAY DT,TT[1:4,1:4];
SAFE OWN REAL ARRAY VT[1:4];
IF ARM_EXECUTE
THEN ARRBLT(TT[1,1],ARM_LINK[6,1,1],16)
ELSE ARRTRAN(TT,LAST_TRANS);
SCALE(VT,DIR,DIST);
REDUCE(VT);
ARRTRAN(DT,TT);
FOR J←1 STEP 1 UNTIL 3 DO DT[J,4]←DT[J,4]+VT[J];
IF DEG ∧ MAGNITUDE(AXIS) THEN BEGIN
UNIT(AXIS,AXIS);
FOR I←1 STEP 1 UNTIL 3 DO BEGIN
CVV(VT,DT,I);
REVOLVE(VT,AXIS,DEG);
CVC(DT,I,VT) END;
END;
INVERT(TT,TT);
TIMES(TT,TT,DT);
IF ARM_EXECUTE THEN ARRTRAN(AV,ARM_VECTOR) ELSE ARRTRAN(AV,LAST_ARM);
FLAG←¬ARM_SOLVE(DT,AV);
IF ¬FLAG THEN BEGIN ARM_EXECUTE←FALSE;RETURN END;
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[21]←'5000000;
ARRBLT(ARM_MESSAGE[1],TT[1,1],12) END
ELSE BEGIN ARRTRAN(LAST_ARM,AV);
FLUSHP(70,AV);
PTR3←PTR3+1;
IF MERGE THEN BEGIN
STACK[PTR3]←'405000000+(PTR4←PTR4+1);
STACK[PTR3]↔STACK[PTR3-1];
MERGE←FALSE END ELSE
STACK[PTR3]←'5000000+(PTR4←PTR4+1);
ARRBLT(COEFF[PTR4],TT[1,1],12) END;
SCHEINMAN(EXF,AV);
IF ARM_EXECUTE
THEN ARRBLT(ARM_MESSAGE[13],EXF[1],7)
ELSE BEGIN ARRBLT(COEFF[PTR4←PTR4+12],EXF[1],7);
PTR4←PTR4+6 END;
RESET_CONO;
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[20]←TIME;
ARMFN(20);
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN COEFF[PTR4←PTR4+1]←TIME;
ARM_TIME←ARM_TIME+TIME;
ARRTRAN(LAST_TRANS,DT) END;
END;
SIMPLE MESSAGE PROCEDURE SET_ARM(STRING ST;REAL ARRAY V,WRT);
BEGIN
SAFE OWN REAL ARRAY T[1:4,1:4];
INVERT(T,WRT);
TIMES(T,V,T);
IF ARM_EXECUTE THEN BEGIN
ARM_MESSAGE[14]←'13000000;
ARM_MESSAGE[1]←CVSIX(ST);
ARRBLT(ARM_MESSAGE[2],T[1,1],12);
ARMFN(13);
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN
FLUSHP(24,LAST_ARM);
STACK[PTR3←PTR3+1]←'13000000+(PTR4←PTR4+1);
COEFF[PTR4]←CVSIX(ST);
ARRBLT(COEFF[PTR4←PTR4+1],T[1,1],12);
PTR4←PTR4+11 END;
END"SET_ARM";
SIMPLE MESSAGE PROCEDURE MOVING(STRING ST;REAL ARRAY V);
BEGIN
IF ARM_EXECUTE THEN BEGIN
ARM_MESSAGE[5]←'24000000;
ARM_MESSAGE[1]←CVSIX(ST);
ARRBLT(ARM_MESSAGE[2],V[1],3);
ARMFN(3);
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN
FLUSHP(4,LAST_ARM);
STACK[PTR3←PTR3+1]←'24000000+(PTR4←PTR4+1);
COEFF[PTR4]←CVSIX(ST);
ARRBLT(COEFF[PTR4←PTR4+1],V[1],3);
PTR4←PTR4+2 END;
END"MOVING";
SIMPLE MESSAGE PROCEDURE DRIVE_ARM(INTEGER JOINT;REAL DEG;INTEGER TIME;REFERENCE INTEGER FLAG);
BEGIN INTEGER I,J,N;
REAL R;
SAFE OWN REAL ARRAY EXF[1:7];
SAFE OWN REAL ARRAY LA[1:6];
FLAG←FALSE;
IF ARM_EXECUTE THEN ARRBLT(LA[1],ARM_VECTOR[1],6) ELSE ARRTRAN(LA,LAST_ARM);
R←LA[JOINT]+DEG;
IF (STOP[JOINT,1]-R)*(R-STOP[JOINT,2])<1 THEN BEGIN ARM_EXECUTE←FALSE;RETURN END;
FLAG←TRUE;
LA[JOINT]←R;
SCHEINMAN(EXF,LA);
IF ARM_EXECUTE
THEN BEGIN ARM_MESSAGE[15]←'23000000;
ARM_MESSAGE[1]←0;ARRBLT(ARM_MESSAGE[2],ARM_MESSAGE[1],5);
ARRBLT(ARM_MESSAGE[JOINT],DEG,1) END
ELSE BEGIN ARRBLT(LAST_TRANS[1,1],T[85],16);
FLUSHP(50,LAST_ARM);
PTR3←PTR3+1;
IF MERGE THEN BEGIN
STACK[PTR3]←'423000000+(PTR4←PTR4+1);
STACK[PTR3]↔STACK[PTR3-1];
MERGE←FALSE END ELSE
STACK[PTR3]←'23000000+(PTR4←PTR4+1);
COEFF[PTR4]←0;
ARRBLT(COEFF[PTR4+1],COEFF[PTR4],5);
ARRBLT(COEFF[PTR4+JOINT-1],DEG,1) END;
IF ARM_EXECUTE
THEN BEGIN ARRBLT(ARM_MESSAGE[7],EXF[1],7);
ARM_MESSAGE[13]←GO_WORD[JOINT]+2;
IF FREE_ARM[0,1] THEN FREE_JOINT(ARM_MESSAGE[13]);
ARM_MESSAGE[14]←TIME;
ARMFN(14);
ARM_EXECUTE←FALSE;
UPDATE_SEG END
ELSE BEGIN ARRBLT(COEFF[PTR4←PTR4+6],EXF[1],7);
PTR4←PTR4+6;
IFC BLUE THENC
COEFF[PTR4]←GO_WORD[JOINT]+4;
ELSEC
COEFF[PTR4]←GO_WORD[JOINT]+2;
ENDC
IF NNUL THEN COEFF[PTR4]←COEFF[PTR4]+'1000000;
IF FREE_ARM[0,1] THEN FREE_JOINT(COEFF[PTR4]);
COEFF[PTR4←PTR4+1]←TIME;
ARM_TIME←ARM_TIME+TIME;
ARRTRAN(LAST_ARM,LA) END;
RESET_CONO;
END;
SIMPLE MESSAGE PROCEDURE STOP_ARM(REAL ARRAY F,M);
BEGIN SAFE OWN REAL ARRAY TQ,XF[1:6];
INTEGER I;
REAL FAC,R,MAX;
HANDPOS(LAST_ARM);
REDUCE(F);
ARRBLT(XF[1],F[1],3);
REDUCE(M);
ARRBLT(XF[4],M[1],3);
FORCE(TQ,XF);
MAX←0.0;
FAC←1.5;
FOR I←1 STEP 1 UNTIL 6 DO IF (R←ABS(TQ[I]/F0[I]))>MAX THEN BEGIN
MAX←R;
BFJ←I END;
R←FAC/MAX;
IF R>1.0 THEN FOR I←1 STEP 1 UNTIL 6 DO TQ[I]←TQ[I]*R;
FLUSHP(7,LAST_ARM);
STACK[PTR3←PTR3+1]←'7000000+(PTR4←PTR4+1);
ARRBLT(COEFF[PTR4],TQ[1],6);
PTR4←PTR4+5;
END;
SIMPLE MESSAGE PROCEDURE NO_NULL;NNUL←-1;
SIMPLE MESSAGE PROCEDURE TALK_ARM;INTERP←TRUE;
SIMPLE MESSAGE PROCEDURE DO_IT(INTEGER PPPN;STRING FILE);
BEGIN INTEGER I;
ARM_STATUS←0;
ARM_EXECUTE←FALSE;
FOR I←0 STEP 1 UNTIL NEXT_BAND-1 DO IF EQU(FILE,BANDS[I])THEN DONE;
DOIT(PPPN,TRACK[I],CVSIX(FILE));
IF ARM_STATUS='50 ∧TRACK[I] THEN BANDS[I]←NULL;
UPDATE_SEG;
END;
SIMPLE MESSAGE PROCEDURE MERGE_ARM;MERGE←TRUE;
SIMPLE MESSAGE PROCEDURE DO_PROCEED(INTEGER SKIP);
BEGIN
ARM_EXECUTE←FALSE;
IF ¬ARM_WAIT THEN RETURN;
ARMPROCEED(SKIP);
UPDATE_SEG;
END;
SIMPLE MESSAGE PROCEDURE OTHER_GO;
IF ARM_EXECUTE
THEN BEGIN
ARM_MESSAGE[1]←'27000000;
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG
END
ELSE BEGIN
FLUSHP(1,LAST_ARM);
STACK[PTR3←PTR3+1]←'27000000
END;
SIMPLE MESSAGE PROCEDURE OTHER_RUN;
IF ARM_EXECUTE
THEN BEGIN
ARM_MESSAGE[1]←'31000000;
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG
END
ELSE BEGIN
FLUSHP(1,LAST_ARM);
STACK[PTR3←PTR3+1]←'31000000
END;
SIMPLE MESSAGE PROCEDURE OTHER_WAIT;
IF ARM_EXECUTE
THEN BEGIN
ARM_MESSAGE[1]←'30000000;
HANDFN;
ARM_EXECUTE←FALSE;
UPDATE_SEG
END
ELSE BEGIN
FLUSHP(1,LAST_ARM);
STACK[PTR3←PTR3+1]←'30000000
END;
SIMPLE MESSAGE PROCEDURE ARM_CONO(REAL ARRAY APPROACH,OBJECT;INTEGER DEPROACH_TIME,MID_TIME);
BEGIN ARRTRAN(ARRIVE_ARM,APPROACH);
OBJECT_MASS←OBJECT[4];
OBJECT_KXX←OBJECT[1];
OBJECT_KYY←OBJECT[2];
OBJECT_KZZ←OBJECT[3];
T2_ARM←MID_TIME;
T1_ARM←DEPROACH_TIME;
END;
SIMPLE MESSAGE PROCEDURE SET_TOUCH(BOOLEAN STOP_ON_TOUCH);
IF ¬ARM_EXECUTE THEN BEGIN FLUSHP(1,LAST_ARM);
STACK[PTR3←PTR3+1]←'6000000;
IF STOP_ON_TOUCH THEN STACK[PTR3]←STACK[PTR3] LOR '777777;
END ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE ARM_SKIPE(INTEGER I);
IF ¬ARM_EXECUTE THEN STACK[PTR3←PTR3+1]←'101000000 LOR I ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE ARM_SKIPN(INTEGER I);
IF ¬ARM_EXECUTE THEN STACK[PTR3←PTR3+1]←'103000000 LOR I ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE ARM_SKIPS(INTEGER I);
IF ¬ARM_EXECUTE THEN STACK[PTR3←PTR3+1]←'104000000 LOR I ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE ARM_JMP(INTEGER I);
IF ¬ARM_EXECUTE THEN STACK[PTR3←PTR3+1]←'102000000 LOR ('777777 LAND I) ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE ARM_AOJ(INTEGER I);
IF ¬ARM_EXECUTE THEN STACK[PTR3←PTR3+1]←'16000000 LOR ('777777 LAND I) ELSE ARM_EXECUTE←FALSE;
SIMPLE MESSAGE PROCEDURE ARM_SOJG(STRING S;INTEGER I);
IF ARM_EXECUTE THEN BEGIN
ARM_EXECUTE←FALSE;;
RETURN END ELSE BEGIN
FLUSHP(3,LAST_ARM);
STACK[PTR3←PTR3+1]←'26000000+(PTR4←PTR4+1);
COEFF[PTR4]←CVSIX(S);
COEFF[PTR4←PTR4+1]←I END;
SIMPLE MESSAGE PROCEDURE ARM_ASSIGN(STRING S;INTEGER VAL);
IF ARM_EXECUTE THEN BEGIN
ARM_MESSAGE[3]←'25000000;
ARM_MESSAGE[1]←CVSIX(S);
ARM_MESSAGE[2]←VAL;
ARMFN(2);
UPDATE_SEG END ELSE
BEGIN
FLUSHP(3,LAST_ARM);
STACK[PTR3←PTR3+1]←'25000000+(PTR4←PTR4+1);
COEFF[PTR4]←CVSIX(S);
COEFF[PTR4←PTR4+1]←VAL END;
SIMPLE MESSAGE PROCEDURE ARM_SAVE(STRING S);
BEGIN
SAFE OWN REAL ARRAY T[1:4,1:4];
INVERT(T,LAST_PLANNED_TRANS);
IF ARM_EXECUTE THEN BEGIN ARM_MESSAGE[13]←'10000000;
ARM_MESSAGE[1]←CVSIX(S) END ELSE
BEGIN FLUSHP(30,LAST_ARM);STACK[PTR3←PTR3+1]←'10000000+(PTR4←PTR4+1);
COEFF[PTR4]←CVSIX(S) END;
IF ARM_EXECUTE THEN ARRBLT(ARM_MESSAGE[2],T[1,1],12)
ELSE ARRBLT(COEFF[PTR4←PTR4+1],T[1,1],12);
IF ARM_EXECUTE THEN BEGIN ARMFN(13);
ARM_EXECUTE←FALSE;
UPDATE_SEG END ELSE PTR4←PTR4+12;
END;
SIMPLE MESSAGE PROCEDURE ARM_RESTORE(STRING S;INTEGER FINISH);
BEGIN
LABEL L1;
INTEGER I,J;
SAFE OWN REAL ARRAY T[1:4,1:4];
IF ARM_EXECUTE THEN BEGIN ARM_EXECUTE←FALSE; RETURN END;
FOR I←PTR3 STEP -1 UNTIL 1 DO BEGIN
J←STACK[I] LAND '77000000;
IF '17000000 ≤ J ≤'21000000 THEN BEGIN
FOR J←PTR3 STEP -1 UNTIL I DO BEGIN
STACK[J+1]←STACK[J];
END;
PTR3←PTR3+1;
GO TO L1
END;
END;
RETURN;
L1: STACK[I]←'11000000+(PTR4←PTR4+1);
COEFF[PTR4]←CVSIX(S);
COEFF[PTR4←PTR4+1]←FINISH;
ARRBLT(COEFF[PTR4←PTR4+1],LAST_PLANNED_TRANS[1,1],12);
ARRBLT(COEFF[PTR4←PTR4+12],LAST_PLANNED_ARM[1],6);
PTR4←PTR4+6;
END;
SIMPLE MESSAGE PROCEDURE SCREW(REAL VELOCITY);
BEGIN INTEGER I;
IF ARM_EXECUTE THEN BEGIN ARM_EXECUTE←FALSE; RETURN END;
STACK[PTR3←PTR3+1]←'22000000 LOR ((I←VELOCITY*1.0) LAND '777777) END;